package fornecedor;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

import endereco.Endereco;
import endereco.EnderecoRN;
import persistencia.RNException;

@ManagedBean(name = "fornecedorBean")
public class FornecedorBean {

	Endereco endereco = new Endereco();

	boolean readOnly = false;

	public boolean isReadOnly() {
		return readOnly;
	}

	public void setReadOnly(boolean readOnly) {
		this.readOnly = readOnly;
	}

	private Fornecedor fornecedor = new Fornecedor();
	@SuppressWarnings("unused")
	private List<Fornecedor> lista;

	public Fornecedor getfornecedor() {
		return fornecedor;
	}

	public void setfornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public String salvar() {
		try {
			FornecedorRN fornecedorRN = new FornecedorRN();
			fornecedorRN.salvar(fornecedor);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, new FacesMessage("fornecedor "
					+ this.fornecedor.getNomeRsocial() + " salvo com Sucesso"));
			return "fornecedorListar";
		} catch (RNException e) {
			e.printStackTrace();

		}
		return "falha";
	}

	public List<Fornecedor> getLista() {

		FornecedorRN fornecedorRN = new FornecedorRN();
		try {
			return fornecedorRN.listar();

		} catch (RNException e) {
			e.printStackTrace();
			return null;
		}

	}

	public String editar() {
		if (this.fornecedor.getCnpjCpf() == null) {
			this.readOnly = false;
			return "fornecedorNovo";
		} else {
			this.readOnly = true;
			return "fornecedorNovo";
		}
	}

	// metodo para validar cpf ou cnpj
	public void validaCpjCnpj() {
		// pega o contexto atual da pagina
		FacesContext contexto = FacesContext.getCurrentInstance();
		FornecedorRN fornecedorRN = new FornecedorRN();
		String cpfCnpj = this.fornecedor.getCnpjCpf();
		String cnpj = "";
		String cpf = "";

		// verificica se o campo cpf/cnpj tem 11 ou 14 digitos
		if (cpfCnpj.length() != 14 && cpfCnpj.length() != 11) {
			FacesMessage mensagem = new FacesMessage();
			mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
			mensagem.setDetail("CPF/CNPJ Inv�lido");
			mensagem.setSummary("CPF/CNPJ Inv�lido");
			contexto.addMessage("frmCli:cpfCnpj", mensagem);
			this.fornecedor.setCnpjCpf("");

		} else {
			if (cpfCnpj.length() == 14) {
				cnpj = cpfCnpj.substring(0, 2) + "." + cpfCnpj.substring(2, 5)
						+ "." + cpfCnpj.substring(5, 8) + "/"
						+ cpfCnpj.substring(8, 12) + "-"
						+ cpfCnpj.substring(12, 14);
			} else {
				cpf = cpfCnpj.substring(0, 3) + "." + cpfCnpj.substring(3, 6)
						+ "." + cpfCnpj.substring(6, 9) + "-"
						+ cpfCnpj.substring(9, 11);
			}
		}

		if (cpfCnpj.length() == 14 && fornecedorRN.buscaPorCpfCnpj(cnpj) != null) {
			this.fornecedor = fornecedorRN.buscaPorCpfCnpj(cnpj);
			this.readOnly = true;

			FacesMessage mensagem = new FacesMessage();
			mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
			mensagem.setDetail("fornecedor ja cadastrado");
			mensagem.setSummary("fornecedor ja cadastrado");
			contexto.addMessage("frmCli:cpfCnpj", mensagem);

		}
		if (cpfCnpj.length() == 11 && fornecedorRN.buscaPorCpfCnpj(cpf) != null) {
			this.fornecedor = fornecedorRN.buscaPorCpfCnpj(cpf);
			this.readOnly = true;

			FacesMessage mensagem = new FacesMessage();
			mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
			mensagem.setDetail("fornecedor ja cadastrado");
			mensagem.setSummary("fornecedor ja cadastrado");
			contexto.addMessage("frmCli:cpfCnpj", mensagem);

		}
		// verifica se � um cnpj
		// elimina numeros squenciais para o cnpj
		if (cpfCnpj.length() == 14) {
			if (cpfCnpj.equals("00000000000000")
					|| cpfCnpj.equals("11111111111111")
					|| cpfCnpj.equals("22222222222222")
					|| cpfCnpj.equals("33333333333333")
					|| cpfCnpj.equals("44444444444444")
					|| cpfCnpj.equals("55555555555555")
					|| cpfCnpj.equals("66666666666666")
					|| cpfCnpj.equals("77777777777777")
					|| cpfCnpj.equals("88888888888888")
					|| cpfCnpj.equals("99999999999999")) {
				FacesMessage mensagem = new FacesMessage();
				mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
				mensagem.setDetail("CNPJ Inv�lido");
				mensagem.setSummary("CNPJ Inv�lido");
				contexto.addMessage("frmCli:cpfCnpj", mensagem);
				this.fornecedor.setCnpjCpf("");

			}
			// calculo do 1� digito veficador
			char dig13, dig14;
			int sm, i, r, num, peso;
			try {
				sm = 0;
				peso = 2;
				for (i = 11; i >= 0; i--) {
					num = (int) (cpfCnpj.charAt(i) - 48);
					sm = sm + (num * peso);
					peso = peso + 1;
					if (peso == 10)
						peso = 2;

				}
				r = sm % 11;
				if ((r == 0) || (r == 1))
					dig13 = '0';
				else
					dig13 = (char) ((11 - r) + 48);
				// calculo do 2� digito veficador
				sm = 0;
				peso = 2;
				for (i = 12; i >= 0; i--) {
					num = (int) (cpfCnpj.charAt(i) - 48);
					sm = sm + (num * peso);
					peso = peso + 1;
					if (peso == 10)
						peso = 2;
				}
				r = sm % 11;
				if ((r == 0) || (r == 1))
					dig14 = '0';
				else
					dig14 = (char) ((11 - r) + 48);
				if ((dig13 == cpfCnpj.charAt(12))
						&& (dig14 == cpfCnpj.charAt(13))) {
					// adiciona mascara no campo se cnpj valido

					this.fornecedor.setCnpjCpf(cpfCnpj.substring(0, 2) + "."
							+ cpfCnpj.substring(2, 5) + "."
							+ cpfCnpj.substring(5, 8) + "/"
							+ cpfCnpj.substring(8, 12) + "-"
							+ cpfCnpj.substring(12, 14));
					// retorno de erro se cnpj n�o valido

				} else {
					FacesMessage mensagem = new FacesMessage();
					mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
					mensagem.setDetail("CNPJ Inv�lido");
					mensagem.setSummary("CNPJ Inv�lido");
					contexto.addMessage("frmCli:cpfCnpj", mensagem);
					this.fornecedor.setCnpjCpf("");
				}
			} catch (Exception e) {
				e.printStackTrace();

			}
		}
		// verifica se � um cpf
		// elimina sequenciais para cpf
		if (cpfCnpj.length() == 11) {
			if (cpfCnpj.equals("00000000000") || cpfCnpj.equals("11111111111")
					|| cpfCnpj.equals("22222222222")
					|| cpfCnpj.equals("33333333333")
					|| cpfCnpj.equals("44444444444")
					|| cpfCnpj.equals("55555555555")
					|| cpfCnpj.equals("66666666666")
					|| cpfCnpj.equals("77777777777")
					|| cpfCnpj.equals("88888888888")
					|| cpfCnpj.equals("99999999999")) {
				FacesMessage mensagem = new FacesMessage();
				mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
				mensagem.setDetail("CPF Invalido");
				mensagem.setSummary("CPF Inv�lido");
				contexto.addMessage("frmCli:cpfCnpj", mensagem);
				this.fornecedor.setCnpjCpf("");

			}
			// calculo para 1� digito
			char dig10, dig11;
			int sm, i, r, num, peso;
			try {
				sm = 0;
				peso = 10;
				for (i = 0; i < 9; i++) {
					num = (int) (cpfCnpj.charAt(i) - 48);
					sm = sm + (num * peso);
					peso = peso - 1;
				}
				r = 11 - (sm % 11);
				if ((r == 10) || (r == 1))
					dig10 = '0';
				else
					dig10 = (char) (r + 48);
				// calculo 2� digito
				sm = 0;
				peso = 11;
				for (i = 0; i < 10; i++) {
					num = (int) (cpfCnpj.charAt(i) - 48);
					sm = sm + (num * peso);
					peso = peso - 1;
				}
				r = 11 - (sm % 11);
				if ((r == 10) || (r == 11))
					dig11 = '0';
				else
					dig11 = (char) (r + 48);
				if ((dig10 == cpfCnpj.charAt(9))
						&& (dig11 == cpfCnpj.charAt(10))) {
					// adiciona mascar se cpf valido

					this.fornecedor.setCnpjCpf(cpfCnpj.substring(0, 3) + "."
							+ cpfCnpj.substring(3, 6) + "."
							+ cpfCnpj.substring(6, 9) + "-"
							+ cpfCnpj.substring(9, 11));

					// retorna erro se cnpj invalido
				} else {
					FacesMessage mensagem = new FacesMessage();
					mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
					mensagem.setDetail("CPF Invalido");
					mensagem.setSummary("CPF Inv�lido");
					contexto.addMessage("frmCli:cpfCnpj", mensagem);
					this.fornecedor.setCnpjCpf("");
				}
			} catch (Exception e) {
				e.printStackTrace();

			}
		}

	}

	public String deletarfornecedor() {
		try {
			FornecedorRN fornecedorRN = new FornecedorRN();
			fornecedorRN.deletar(fornecedor);
			return "fornecedorListar";

		} catch (RNException e) {
			e.printStackTrace();
		}
		return "falha";
	}

	public void buscaPorCep() {
		FacesContext contexto = FacesContext.getCurrentInstance();
		EnderecoRN enderecoRN = new EnderecoRN();
		String cep = this.fornecedor.getCep();
		if (cep.contains(".") || cep.contains("-")) {
			FacesMessage mensagem = new FacesMessage();
			mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
			mensagem.setDetail("Somento Numeros com 8 Digitos");
			mensagem.setSummary("Somento Numeros com 8 Digitos");
			contexto.addMessage("frmCli:cep", mensagem);
			this.fornecedor.setCep("");
		}
		this.endereco = enderecoRN.buscaPorCep(cep);
		if (this.endereco == null) {
			FacesMessage mensagem = new FacesMessage();
			mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
			mensagem.setDetail("CEP Inv�lido");
			mensagem.setSummary("CEP Inv�lido");
			contexto.addMessage("frmCli:cep", mensagem);
			this.fornecedor.setCep("");
		}

		if (cep.length() == 8 && this.endereco != null) {
			String cepAux = this.fornecedor.getCep().substring(0, 2) + "."
					+ this.fornecedor.getCep().substring(2, 5) + "-"
					+ this.fornecedor.getCep().substring(5, 8);

			this.fornecedor.setBairro(endereco.getBairro().getBairro()
					.toUpperCase());
			this.fornecedor.setEndereco(endereco.getEndereco().toUpperCase()
					+ ", ");

			this.fornecedor.setCidade(endereco.getCidade().getCidade().toUpperCase());
			this.fornecedor.setUf(endereco.getCidade().getUf().toUpperCase());

			this.fornecedor.setCep(cepAux);

		}

	}

}
